Don't unshadow when the shadow l2 is the current used shadow table.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 8 Dec 2005 14:21:36 +0000 (15:21 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 8 Dec 2005 14:21:36 +0000 (15:21 +0100)
Otherwise, when destroying the domain, if the current sl2 is unpinned
then the shadow page will be freed without accquire the shadow_lock.
This may also improve the performance due to avoiding uncessary
unshadow.

Signed-off-by: Xiaofeng Ling <xiaofeng.ling@intel.com>
xen/arch/x86/shadow.c
xen/arch/x86/shadow32.c

index d6c052428e8e75a9dc4b487937848aceb4254609..c8a9f1eb0277543c9fa9d344f652655c9a2d9fc2 100644 (file)
@@ -1450,6 +1450,7 @@ static int resync_all(struct domain *d, u32 stype)
     int changed;
     u32 min_max_shadow, min_max_snapshot;
     int min_shadow, max_shadow, min_snapshot, max_snapshot;
+    struct vcpu *v;
 
     ASSERT(shadow_lock_is_acquired(d));
 
@@ -1739,6 +1740,9 @@ static int resync_all(struct domain *d, u32 stype)
 
         if ( unlikely(unshadow) )
         {
+            for_each_vcpu(d, v)
+                if(smfn == pagetable_get_pfn(v->arch.shadow_table))
+                    return need_flush;
             perfc_incrc(unshadow_l2_count);
             shadow_unpin(smfn);
 #if CONFIG_PAGING_LEVELS == 2
index 298fdb1a5d8f0bd82e21b5c02fa2204eb473ef66..7d517ec3903541c862aca83696364b4341b2958c 100644 (file)
@@ -2326,6 +2326,7 @@ static int resync_all(struct domain *d, u32 stype)
     int changed;
     u32 min_max_shadow, min_max_snapshot;
     int min_shadow, max_shadow, min_snapshot, max_snapshot;
+    struct vcpu *v;
 
     ASSERT(shadow_lock_is_acquired(d));
 
@@ -2527,6 +2528,9 @@ static int resync_all(struct domain *d, u32 stype)
 
         if ( unlikely(unshadow) )
         {
+            for_each_vcpu(d, v)
+                if(smfn == pagetable_get_pfn(v->arch.shadow_table))
+                    return need_flush;
             perfc_incrc(unshadow_l2_count);
             shadow_unpin(smfn);
             if ( unlikely(shadow_mode_external(d)) )